﻿
#define INT_64_BITS
#include <iostream>

#include "ostrbuf.h"

// using namespace std;
using namespace sky;

// int dosomething(TCHAR* dest_buf, int max_size)
// {
//     TCHAR buf[] = "some thing some thing some thing some thing ";
//     int actualCpySize = max_size / 2 + 1;
//     std::char_traits<TCHAR>::_Copy_s(dest_buf, max_size, buf, actualCpySize);
//     return actualCpySize;
// }

int main()
{
    ostrbuf osb;
    // 如果怕缓冲区不够，先直接设置一下
    //osb.reserve(1024);

    // osb << "abcd" << endl;

    // 这些操作类似ostream的功能
    osb<<(unsigned int)0xffffffff<<","<<(int)0x80000001<<endl;// endl即换行符
    osb<<99<<","<<(short)14<<","<<-15<<endl;
    osb<<(__int64)0x8000000000000001<<","<<(unsigned __int64)0xffffffffffffffff<<endl;
    osb<<15.1367891024f<<","<<9999.123456789<<endl;

    // 将一个字符串的子串写入
    osb<<ostrbuf::substr("我们你们他们abcdefg", 12)<<endl;

    // 定制的格式化
    // osb<<ostrbuf::formatf("%02.6f", 3.1415926f)<<endl;
    osb<<_fi("%04d", 25)<<endl; // 这种写法更简洁
    osb<<_fi("%X", 255)<<endl;


    // // 直接操作缓冲区示例（在不知情的情况下不推荐这样操作，知情的情况下，也不错，很方便，至少少了字符串拷贝操作）
    // osb.grow(64);	// 可能需要128字节空间，这个数值必须正确才能防止缓存越界
    // int off = dosomething(osb.cur(), 64); // dosomething 已经完全抛开了 ostrbuf 类，不受任何拘束，危险！
    // osb.seek(off);	// 手动将位置seek到正确位置
    // osb<<ends;		// 因上面的 dosomething 没有在缓冲区最后加入'\0'，这里不能忘记，除了像 dosomething 这样直接对缓冲区进行写外，其他的操作都会自动加'\0'

    

    std::cout << osb.c_str() << std::endl;

    ostrbuf osb2;
    // 输入另一个对象
    osb2 << osb << endl;
    //输入字符串
    osb2<< "skysky" << endl;
    //输入一个子串
    osb2<<_ss("hello world", 5) << ostrbuf::substr("world hello", 5) << endl;
    //输入一个std::string对象
    std::string m_str = "a string obh";
    osb2 << m_str << endl;
    //输入一个字符
    osb2 << 'a' << " " << 'c' << 'h' << 'a' << 'r' << endl;
    // add_fromat
    osb2.add_format("%02d:%02d", 8, 00) << endl;

    std::cout << osb2.c_str();

    

    // std::cout << (long)0xffffffffffffffff << std::endl;

    // std::cout<<WtoA(osb.c_str());
    
}